package com.example.demo;

import java.util.LinkedList;

public class Practice {

    //给定一个包含非负整数的 m x n 网格，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。
    //
    //说明：每次只能向下或者向右移动一步。
    //
    //示例:
    //
    //输入:
    //[
    //  [1,3,1],
    //  [1,5,1],
    //  [4,2,1]
    //]
    //输出: 7
    //解释: 因为路径 1→3→1→1→1 的总和最小。


    //给定一个无序的整数数组，找到其中最长上升子序列的长度。
    //
    //示例:
    //
    //输入: [10,9,2,5,3,7,101,18]
    //输出: 4
    //解释: 最长的上升子序列是 [2,3,7,101]，它的长度是 4


    //打家劫舍问题

    //快排

    //选择排序

    //归并排序

    //二分查找 左边界 有边界

    ////选择排序
    //
    //冒泡排序

    //奇数放前 偶数放后

    //如何高效对有序数组/链表去重？ 返回去重之后的数组长度
    private static int [] nums = {1,2,2,3,3,3,4};
    public static int deleteDuplicates(int [] nums ){
        if(nums==null || nums.length == 0 ){
            return 0;
        }
        int slow = 0; int fast = 1;

        while(fast<nums.length){
            if(nums[slow]!=nums[fast]){
                slow++;
                nums[slow] = nums[fast];
            }
            fast++;
        }

        return slow+1;
    }



    public static void main(String[] args) {
        int i = deleteDuplicates(nums);
        System.out.println(i);

        int [][] nums = new int[4][];
        nums[0] = new int[]{1, 2, 3,10};
        nums[1] = new int[]{1, 2, 3,4};
        nums[2] = new int[]{1, 2, 3,4};
        nums[3] = new int[]{1, 2, 3,4};
        System.out.println(nums[0][nums.length-1]);
    }

    //在 未排序 的数组中找到第 k 个最大的元素。请注意，你需要找的是数组排序后的第 k 个最大的元素，而不是第 k 个不同的元素。

    //反转链表

    //合并 K 个排序链表

    //java 链表 双向链表 循环链表

    //给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。

    //给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。

    //给定一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？找出所有满足条件且不重复的三元组。

    //给定两个数组，编写一个函数来计算它们的交集。

    //给定两个数组，编写一个函数来计算它们的交集。

    //二叉树的前序遍历 https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247486350&idx=3&sn=f847d84a0c2553d2854b37b6202cb923&chksm=fa0e640fcd79ed19006e12d9d4e330fca44db451413a5870de3758515be60f387d43a1f80ef1&scene=21#wechat_redirect

}
